/**
 * @author : WXY
 * @program : AdvanceClass
 * @className ：Code03_MaxABSBetweenLeftAndRight
 * @create : 2022/11/8:21:31
 * @info : 最大值的绝对值在左右之间
 * 题目三
 * 给定一个数组arr长度为N，你可以把任意长度大于0且小于N的前缀作为左部分，
 * 剩下的作为右部分。但是每种划分下都有左部分的最大值和右部分的最大值，请
 * 返回最大的, 左部分最大值减去右部分最大值的绝对值。
 **/
public class Code03_MaxABSBetweenLeftAndRight {
    public static int maxABS(int[] arr) {
        int max = Integer.MIN_VALUE;
        for (int i = 0; i < arr.length; i++) {
            max = max < arr[i] ? arr[i] : max;
        }
        return max - Math.min(arr[0], arr[arr.length - 1]);
    }
    public static int[] generateRandomArray(int length) {
        int[] arr = new int[length];
        for (int i = 0; i != arr.length; i++) {
            arr[i] = (int) (Math.random() * 1000) - 499;
        }
        return arr;
    }

    public static int maxABS1(int[] arr) {
        int res = Integer.MIN_VALUE;
        int maxLeft = 0;
        int maxRight = 0;
        for (int i = 0; i != arr.length - 1; i++) {
            maxLeft = Integer.MIN_VALUE;
            for (int j = 0; j != i + 1; j++) {
                maxLeft = Math.max(arr[j], maxLeft);
            }
            maxRight = Integer.MIN_VALUE;
            for (int j = i + 1; j != arr.length; j++) {
                maxRight = Math.max(arr[j], maxRight);
            }
            res = Math.max(Math.abs(maxLeft - maxRight), res);
        }
        return res;
    }

    public static int maxABS2(int[] arr) {
        int[] lArr = new int[arr.length];
        int[] rArr = new int[arr.length];
        lArr[0] = arr[0];
        rArr[arr.length - 1] = arr[arr.length - 1];
        for (int i = 1; i < arr.length; i++) {
            lArr[i] = Math.max(lArr[i - 1], arr[i]);
        }
        for (int i = arr.length - 2; i > -1; i--) {
            rArr[i] = Math.max(rArr[i + 1], arr[i]);
        }
        int max = 0;
        for (int i = 0; i < arr.length - 1; i++) {
            max = Math.max(max, Math.abs(lArr[i] - rArr[i + 1]));
        }
        return max;
    }




    public static void main(String[] args) {
        int[] arr = generateRandomArray(200);
        System.out.println(maxABS(arr));
        System.out.println(maxABS1(arr));
        System.out.println(maxABS2(arr));
    }
}
